package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.enums.EhsEpibolyStatusEnum;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.IdentifierUtil;
import qc.module.ehs.dto.epibolyunit.EpibolyUnitDto;
import qc.module.ehs.dto.epibolyunit.EpibolyUnitQueryConditionDto;
import qc.module.ehs.entity.EhsEpibolyUnit;
import qc.module.ehs.mapper.EhsEpibolyUnitMapper;
import qc.module.ehs.repository.EhsEpibolyUnitRepository;

import java.util.List;
import java.util.Objects;

/**
 * @author YRR
 * @create 2025-03-13 10:10
 */
@Service
public class EhsEpibolyUnitService {

    @Autowired
    private EhsEpibolyUnitRepository repository;

    /**
     * 查询相关方单位的信息
     * @param dto 查询条件的信息
     * @return List<EpibolyUnitDto>
     * @throws QCPromptException
     */
    public List<EpibolyUnitDto> query(EpibolyUnitQueryConditionDto dto) throws QCPromptException {
        //1. 验证查询条件
        if (dto == null) throw new QCPromptException("查询相关单位条件不能为空");
        if (StringUtils.isBlank(dto.getOrgcode())) throw new QCPromptException("组织代码不能为空");

        //2、构建查询条件
        LambdaQueryWrapper<EhsEpibolyUnit> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsEpibolyUnit::getOrgcode, dto.getOrgcode());

        //3、验证状态查询
        if (StringUtils.isNotBlank(dto.getStatus())) {
            EhsEpibolyStatusEnum status = getEnumFromStatus(dto.getStatus());
            if (status == null) {
                throw new QCPromptException("查询的状态条件不正确");
            }
            wrapper.eq(EhsEpibolyUnit::getStatus, status);
        }

        //4、 处理关键字搜索(单位名称、类型、负责人、介绍信息)
        if (StringUtils.isNotBlank(dto.getKeywords())) {
            wrapper.and(w -> w
                    .like(EhsEpibolyUnit::getUnitname, dto.getKeywords()).or()
                    .like(EhsEpibolyUnit::getType, dto.getKeywords()).or()
                    .like(EhsEpibolyUnit::getResname, dto.getKeywords()).or()
                    .like(EhsEpibolyUnit::getDescription, dto.getKeywords()));
        }

        //5、通过名字排序
        wrapper.orderByAsc(EhsEpibolyUnit::getUnitname);

        //6、 执行查询
        List<EhsEpibolyUnit> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsEpibolyUnitMapper.MAPPER.toDtoList(ens);
        }
        return null;

    }

    /**
     * 新增相关方单位的信息
     * @param dto
     * @return 成功返回null，失败返回错误或提示信息
     */
    public String add(EpibolyUnitDto dto) {
        //1、dto判空
        if (dto == null) return QCUnifyReturnValue.Warn("增加信息不能为空");
        if (StringUtils.isBlank(dto.getUnitname())) return QCUnifyReturnValue.Warn("相关方单位名称不能为空");
        if (StringUtils.isBlank(dto.getOrgcode())) return QCUnifyReturnValue.Warn("组织代码不能为空");
        if (StringUtils.isBlank(dto.getType())) return QCUnifyReturnValue.Warn("相关方单位类型不能为空");

        EhsEpibolyUnit entity = EhsEpibolyUnitMapper.MAPPER.dtoToEntity(dto);
        entity.setUnitid(IdentifierUtil.randomUUID());
        if (repository.insert(entity) < 0x1) {
            return QCUnifyReturnValue.Warn("保存失败");
        }

        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改相关方单位的信息
     * @param dto
     * @return 成功返回null，失败返回错误或提示信息
     */
    public String update(EpibolyUnitDto dto) {
        //1、dto有效性验证
        if (dto == null) return QCUnifyReturnValue.Warn("修改信息不能为空");
        if (StringUtils.isBlank(dto.getUnitid())) return QCUnifyReturnValue.Warn("相关方单位的ID不能为空");
        if (StringUtils.isBlank(dto.getUnitname())) return QCUnifyReturnValue.Warn("相关方单位的名称不能为空");
        if (StringUtils.isBlank(dto.getOrgcode())) return QCUnifyReturnValue.Warn("相关方单位的组织代码不能为空");
        if (StringUtils.isBlank(dto.getType())) return QCUnifyReturnValue.Warn("相关方单位的状态不能为空");

        //2、校验id是否存在
        EhsEpibolyUnit epibolyUnit = repository.selectById(dto.getUnitid());
        if (Objects.isNull(epibolyUnit)) {
            return QCUnifyReturnValue.Warn("修改的id不存在");
        }

        EhsEpibolyUnit entity = EhsEpibolyUnitMapper.MAPPER.dtoToEntity(dto);
        if (repository.updateById(entity) < 0x1) {
            return QCUnifyReturnValue.Warn("相关方单位的修改数据失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改指定的相关方单位的状态，设置为黑名单
     * @param id 条件
     * @return null为成功，错误返回提示信息
     */
    public String addToBlackList(String id) {
        //1、判断是否存在
        EhsEpibolyUnit entity = repository.selectById(id);
        if (Objects.isNull(entity)) return QCUnifyReturnValue.Warn("相关方单位的修改id不存在");

        //2、检查当前状态
        if (EhsEpibolyStatusEnum.BLACKLIST == entity.getStatus()) {
            return QCUnifyReturnValue.Warn("相关方单位的当前状态已是黑名单");
        }

        //3、修改状态
        LambdaUpdateWrapper<EhsEpibolyUnit> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(EhsEpibolyUnit::getUnitid, id);
        wrapper.set(EhsEpibolyUnit::getStatus, EhsEpibolyStatusEnum.BLACKLIST);
        if (repository.update(null, wrapper) < 0x1) {
            return QCUnifyReturnValue.Warn("相关方单位的修改数据操作失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除指定的相关方单位的信息
     * @param id
     * @return 成功返回null，失败返回错误或提示信息
     */
    public String delete(String id) {
        if (repository.deleteById(id) < 0x1)
            return QCUnifyReturnValue.Warn("相关方单位的删除的信息不存在");
        return QCUnifyReturnValue.Success();
    }

    /**
     * 状态字符创转换枚举类型
     * @param status 相关单位的状态
     * @return EhsEpibolyStatusEnum
     */
    EhsEpibolyStatusEnum getEnumFromStatus(String status) {
        try {
            //尝试将字符串转换为整数
            int statusCode = Integer.parseInt(status);
            for (EhsEpibolyStatusEnum item : EhsEpibolyStatusEnum.values()) {
                if (item.getIndex() == statusCode) {
                    return item;
                }
            }
        } catch (NumberFormatException e) {
            return null;
        }
        return null;
    }
}
